#include <iostream>
using namespace std;

class MyClassA
{
public:
    MyClassA(int a) //前提是类A中必须含有相应的有参构造函数
    {
        this->a = a;
        cout << "构造函数调用" << endl;
    }

    ~MyClassA()
    {
        cout << "析构函数调用" << endl;
    }

private:
    int a;
};

//必须使用构造函数参数初始化列表的两种情况
class MyClassB
{
public:
    MyClassB(int b, int m, int n, int k) : a1(m), a2(n), c(k)
    {
        this->b = b;
        cout << "构造函数调用" << endl;
    }

    ~MyClassB()
    {
        cout << "析构函数调用" << endl;
    }

private:
    int b;
    //1.一个类的成员中含有另一个类对象，需使用初始化列表来给成员类初始化
    MyClassA a1, a2;
    //2.const类型的变量必须使用初始化参数列表来初始化
    const int c;
};

void ClassTest()
{
    MyClassB B1(1, 2, 3, 4);
}

class MyClassA2
{
public:
    MyClassA2()
    {
        cout << "构造函数调用" << endl;
    }

    ~MyClassA2()
    {
        cout << "析构函数调用" << endl;
    }

private:
    int a;
};

class MyClassA3
{
public:
    MyClassA3(int a1, int a2)
    {
        this->a1 = a1;
        this->a2 = a2;
        cout << "构造函数调用" << endl;
    }

    ~MyClassA3()
    {
        cout << "析构函数调用" << endl;
    }

private:
    int a1;
    int a2;
};

class MyClassB2
{
public:
    //错误(活动) E0289 没有与参数列表匹配的构造函数
    //因为MyClassA2 MyClassA3中均没有一个参数的构造函数，所以报错，没有匹配的构造函数
    MyClassB2(int b, int m, int n) : a2(m), a3(n)
    {
        this->b = b;
        cout << "构造函数调用" << endl;
    }

    //正确做法，根据MyClassA2 MyClassA3定义的构造函数来设置MyClassB2的初始化列表
    /*
    MyClassB2(int b, int m, int n) : a2(), a3(m, n)
 {
  this->b = b;
  cout << "构造函数调用" << endl;
 }
    */

    ~MyClassB2()
    {
        cout << "析构函数调用" << endl;
    }

private:
    int b;
    MyClassA2 a2;
    MyClassA3 a3;
};

void ClassTest2()
{
    MyClassB2(1, 2, 3);
}

int main()
{
    ClassTest(); //加断点单步调试来观察构造函数与析构函数的调用机制
    ClassTest2();

    std::cout << "Hello World!\n";
    system("pause");
    return 0;
}